Preserve track segement boundaries when reversing a track.
authorrobertlipe@gmail.com <robertlipe@gmail.com@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Mon, 14 May 2012 13:48:18 +0000 (13:48 +0000)
committerrobertlipe@gmail.com <robertlipe@gmail.com@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Mon, 14 May 2012 13:48:18 +0000 (13:48 +0000)
git-svn-id: http://gpsbabel.googlecode.com/svn/trunk@4175 f51c46e8-681c-474f-0cfe-069cfd0219fb

gpsbabel/reference/track/trk_reverse_test-fwd.gpx [new file with mode: 0644]
gpsbabel/reference/track/trk_reverse_test-rev.gpx [new file with mode: 0644]
gpsbabel/reverse_route.c
gpsbabel/testo.d/track.test

diff --git a/gpsbabel/reference/track/trk_reverse_test-fwd.gpx b/gpsbabel/reference/track/trk_reverse_test-fwd.gpx
new file mode 100644 (file)
index 0000000..0be5ecb
--- /dev/null
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gpx
+  version="1.0"
+  creator="GPSBabel - http://www.gpsbabel.org"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xmlns="http://www.topografix.com/GPX/1/0"
+  xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
+<time>1970-01-01T00:00:00Z</time>
+<bounds minlat="40.000000000" minlon="-106.300000000" maxlat="50.200000000" maxlon="-105.100000000"/>
+<trk>
+  <name>track one</name>
+<trkseg>
+<trkpt lat="40.000000000" lon="-105.100000000">
+</trkpt>
+<trkpt lat="40.100000000" lon="-105.200000000">
+</trkpt>
+<trkpt lat="40.200000000" lon="-105.300000000">
+</trkpt>
+</trkseg>
+<trkseg>
+<trkpt lat="50.000000000" lon="-106.100000000">
+</trkpt>
+<trkpt lat="50.100000000" lon="-106.200000000">
+</trkpt>
+<trkpt lat="50.200000000" lon="-106.300000000">
+</trkpt>
+</trkseg>
+</trk>
+<trk>
+  <name>track two</name>
+<trkseg>
+<trkpt lat="40.000000000" lon="-105.100000000">
+</trkpt>
+</trkseg>
+<trkseg>
+<trkpt lat="40.100000000" lon="-105.200000000">
+</trkpt>
+<trkpt lat="40.200000000" lon="-105.300000000">
+</trkpt>
+<trkpt lat="50.000000000" lon="-106.100000000">
+</trkpt>
+<trkpt lat="50.100000000" lon="-106.200000000">
+</trkpt>
+<trkpt lat="50.200000000" lon="-106.300000000">
+</trkpt>
+</trkseg>
+</trk>
+<trk>
+  <name>track three</name>
+<trkseg>
+<trkpt lat="40.000000000" lon="-105.100000000">
+</trkpt>
+<trkpt lat="40.100000000" lon="-105.200000000">
+</trkpt>
+<trkpt lat="40.200000000" lon="-105.300000000">
+</trkpt>
+<trkpt lat="50.000000000" lon="-106.100000000">
+</trkpt>
+<trkpt lat="50.100000000" lon="-106.200000000">
+</trkpt>
+</trkseg>
+<trkseg>
+<trkpt lat="50.200000000" lon="-106.300000000">
+</trkpt>
+</trkseg>
+</trk>
+</gpx>
diff --git a/gpsbabel/reference/track/trk_reverse_test-rev.gpx b/gpsbabel/reference/track/trk_reverse_test-rev.gpx
new file mode 100644 (file)
index 0000000..2517f80
--- /dev/null
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gpx
+  version="1.0"
+  creator="GPSBabel - http://www.gpsbabel.org"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xmlns="http://www.topografix.com/GPX/1/0"
+  xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
+<time>1970-01-01T00:00:00Z</time>
+<bounds minlat="40.000000000" minlon="-106.300000000" maxlat="50.200000000" maxlon="-105.100000000"/>
+<trk>
+  <name>track one</name>
+<trkseg>
+<trkpt lat="50.200000000" lon="-106.300000000">
+</trkpt>
+<trkpt lat="50.100000000" lon="-106.200000000">
+</trkpt>
+<trkpt lat="50.000000000" lon="-106.100000000">
+</trkpt>
+</trkseg>
+<trkseg>
+<trkpt lat="40.200000000" lon="-105.300000000">
+</trkpt>
+<trkpt lat="40.100000000" lon="-105.200000000">
+</trkpt>
+<trkpt lat="40.000000000" lon="-105.100000000">
+</trkpt>
+</trkseg>
+</trk>
+<trk>
+  <name>track two</name>
+<trkseg>
+<trkpt lat="50.200000000" lon="-106.300000000">
+</trkpt>
+<trkpt lat="50.100000000" lon="-106.200000000">
+</trkpt>
+<trkpt lat="50.000000000" lon="-106.100000000">
+</trkpt>
+<trkpt lat="40.200000000" lon="-105.300000000">
+</trkpt>
+<trkpt lat="40.100000000" lon="-105.200000000">
+</trkpt>
+</trkseg>
+<trkseg>
+<trkpt lat="40.000000000" lon="-105.100000000">
+</trkpt>
+</trkseg>
+</trk>
+<trk>
+  <name>track three</name>
+<trkseg>
+<trkpt lat="50.200000000" lon="-106.300000000">
+</trkpt>
+</trkseg>
+<trkseg>
+<trkpt lat="50.100000000" lon="-106.200000000">
+</trkpt>
+<trkpt lat="50.000000000" lon="-106.100000000">
+</trkpt>
+<trkpt lat="40.200000000" lon="-105.300000000">
+</trkpt>
+<trkpt lat="40.100000000" lon="-105.200000000">
+</trkpt>
+<trkpt lat="40.000000000" lon="-105.100000000">
+</trkpt>
+</trkseg>
+</trk>
+</gpx>
index 18bbe770a49ff14e811b7b9743ab3f51d995338c..b98cac1b39931e868ffa9fc7bc3ea39b26896bfe 100644 (file)
 
 #define MYNAME "Route reversal filter"
 
+static int prev_new_trkseg;
+
 static
 arglist_t reverse_route_args[] = {
   ARG_TERMINATOR
 };
 
+/*
+ * reverse_route_wpt fixes up the waypoint flag new_trkseg
+ */
+static void reverse_route_wpt(const waypoint* waypointp)
+{
+
+    /* Cast away const-ness */
+    waypoint* wpp = (waypoint *) waypointp;
+    
+    int curr_new_trkseg;
+    
+    curr_new_trkseg = waypointp->wpt_flags.new_trkseg;
+    wpp->wpt_flags.new_trkseg = prev_new_trkseg;
+    prev_new_trkseg = curr_new_trkseg;
+}
+
 void
 reverse_route_head(const route_head *rte)
 {
   route_reverse(rte);
+  prev_new_trkseg = 1;
 }
 
 void
 reverse_route_process(void)
 {
-  track_disp_all(reverse_route_head, NULL, NULL);
+  track_disp_all(reverse_route_head, NULL, reverse_route_wpt);
   route_disp_all(reverse_route_head, NULL, NULL);
 }
 
index 65bdf11ba0609ffb6850bfd1849bce85d91a6a2b..379cf4b8f88c50c90fb5c0587286adccb416361d 100644 (file)
@@ -19,3 +19,7 @@ gpsbabel -t -i unicsv -f ${REFERENCE}/track/trackfilter_faketime.txt -x track,fa
 compare ${REFERENCE}/track/trackfilter_faketime.gpx ${TMPDIR}/ft.gpx
 gpsbabel -t -i unicsv -f ${REFERENCE}/track/trackfilter_faketime.txt -x track,faketime=f20100506060000+5 -o gpx -F ${TMPDIR}/ftf.gpx
 compare ${REFERENCE}/track/trackfilter_faketime_forced.gpx ${TMPDIR}/ftf.gpx
+
+# reverse the track
+gpsbabel -t -i gpx -f ${REFERENCE}/track/trk_reverse_test-fwd.gpx -x reverse -o gpx -F ${TMPDIR}/trk_reverse_test-rev.gpx
+compare ${REFERENCE}/track/trk_reverse_test-rev.gpx ${TMPDIR}/trk_reverse_test-rev.gpx